"""
响应工具
提供统一的API响应格式和辅助函数
"""
from flask import jsonify
from werkzeug.http import HTTP_STATUS_CODES


def success_response(data=None, message="操作成功", status_code=200):
    """
    成功响应
    
    参数:
        data: 响应数据
        message: 成功消息
        status_code: HTTP状态码
    
    返回:
        包含状态、消息和数据的JSON响应
    """
    response = {
        'status': 'success',
        'message': message
    }
    
    if data is not None:
        response['data'] = data
        
    return jsonify(response), status_code


def error_response(message=None, status_code=400, errors=None):
    """
    错误响应
    
    参数:
        message: 错误消息
        status_code: HTTP状态码
        errors: 详细错误信息
    
    返回:
        包含状态、消息和错误详情的JSON响应
    """
    if message is None:
        message = HTTP_STATUS_CODES.get(status_code, '未知错误')
        
    response = {
        'status': 'error',
        'message': message
    }
    
    if errors is not None:
        response['errors'] = errors
        
    return jsonify(response), status_code


def validation_error(errors, message="数据验证失败"):
    """
    数据验证错误响应
    
    参数:
        errors: 验证错误详情
        message: 错误消息
    
    返回:
        包含验证错误的错误响应
    """
    return error_response(message=message, status_code=422, errors=errors)


def unauthorized_error(message="未授权访问"):
    """
    未授权错误响应
    
    参数:
        message: 错误消息
    
    返回:
        未授权错误响应
    """
    return error_response(message=message, status_code=401)


def forbidden_error(message="禁止访问"):
    """
    禁止访问错误响应
    
    参数:
        message: 错误消息
    
    返回:
        禁止访问错误响应
    """
    return error_response(message=message, status_code=403)


def not_found_error(message="资源不存在"):
    """
    资源不存在错误响应
    
    参数:
        message: 错误消息
    
    返回:
        资源不存在错误响应
    """
    return error_response(message=message, status_code=404)


def server_error(message="服务器内部错误"):
    """
    服务器错误响应
    
    参数:
        message: 错误消息
    
    返回:
        服务器错误响应
    """
    return error_response(message=message, status_code=500)


def created_response(data=None, message="创建成功"):
    """
    资源创建成功响应
    
    参数:
        data: 响应数据
        message: 成功消息
    
    返回:
        资源创建成功响应
    """
    return success_response(data=data, message=message, status_code=201)


def no_content_response():
    """
    无内容响应（用于删除操作）
    
    返回:
        无内容响应
    """
    return "", 204


def paginated_response(data, page, per_page, total, message="获取成功"):
    """
    分页响应
    
    参数:
        data: 当前页数据
        page: 当前页码
        per_page: 每页数量
        total: 总记录数
        message: 成功消息
    
    返回:
        包含分页信息的成功响应
    """
    total_pages = (total + per_page - 1) // per_page
    
    pagination = {
        'page': page,
        'per_page': per_page,
        'total': total,
        'total_pages': total_pages,
        'has_next': page < total_pages,
        'has_prev': page > 1
    }
    
    return success_response(
        data={
            'items': data,
            'pagination': pagination
        },
        message=message
    ) 